/* * Copyright (C) 2015 Arles. All rights reserved. * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.arles.swissmanager.test.util; import android.support.annotation.IdRes; import android.support.test.espresso.PerformException; import android.support.test.espresso.UiController; import android.support.test.espresso.ViewAction; import android.support.test.espresso.matcher.ViewMatchers; import android.support.test.espresso.util.HumanReadables; import android.support.v7.widget.RecyclerView; import android.view.View; import org.hamcrest.Matcher; import org.hamcrest.Matchers; /** * Created by Admin on 22.07.2015. */ public class RecyclerViewMatcherBase { public static <VH extends RecyclerView.ViewHolder> ViewAction actionOnItemViewAtPosition(int position, @IdRes int viewId, ViewAction viewAction) { return new ActionOnItemViewAtPositionViewAction(position, viewId, viewAction); } private static final class ActionOnItemViewAtPositionViewAction<VH extends RecyclerView .ViewHolder> implements ViewAction { private final int position; private final ViewAction viewAction; private final int viewId; private ActionOnItemViewAtPositionViewAction(int position, @IdRes int viewId, ViewAction viewAction) { this.position = position; this.viewAction = viewAction; this.viewId = viewId; } public Matcher<View> getConstraints() { return Matchers.allOf(new Matcher[] { ViewMatchers.isAssignableFrom(RecyclerView.class), ViewMatchers.isDisplayed() }); } public String getDescription() { return "actionOnItemAtPosition performing ViewAction: " + this.viewAction.getDescription() + " on item at position: " + this.position; } public void perform(UiController uiController, View view) { RecyclerView recyclerView = (RecyclerView) view; (new ScrollToPositionViewAction(this.position)).perform(uiController, view); uiController.loopMainThreadUntilIdle(); View targetView = recyclerView.getChildAt(this.position).findViewById(this.viewId); if (targetView == null) { throw (new PerformException.Builder()).withActionDescription(this.toString()) .withViewDescription( HumanReadables.describe(view)) .withCause(new IllegalStateException( "No view with id " + this.viewId + " found at position: " + this.position)) .build(); } else { this.viewAction.perform(uiController, targetView); } } } private static final class ScrollToPositionViewAction implements ViewAction { private final int position; private ScrollToPositionViewAction(int position) { this.position = position; } public Matcher<View> getConstraints() { return Matchers.allOf(new Matcher[] { ViewMatchers.isAssignableFrom(RecyclerView.class), ViewMatchers.isDisplayed() }); } public String getDescription() { return "scroll RecyclerView to position: " + this.position; } public void perform(UiController uiController, View view) { RecyclerView recyclerView = (RecyclerView) view; recyclerView.scrollToPosition(this.position); } } public static RecyclerViewMatcher withRecyclerView(final int recyclerViewId) { return new RecyclerViewMatcher(recyclerViewId); } }